home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / bbs / mfm_111b.zip / EDIT.PAS < prev    next >
Pascal/Delphi Source File  |  1992-01-07  |  12KB  |  305 lines

  1. {========================================================================}
  2. Function EditLine(LineToEdit : String; MaxLength, Row, Col : Byte) : String;
  3.   Var
  4.     Elc : Char;
  5.     Elb : Byte;
  6.     OverWrite : Boolean;
  7.     CharacterPosition, OffSet : Byte;
  8.   Begin
  9.     CharacterPosition := 1; OverWrite := True; AnsiGotoXY(Row,1+Col);
  10.     OffSet := 0;
  11.     Repeat
  12.       Repeat
  13.         Elb := GetInput;
  14.         If Elb = 0 Then
  15.         Begin
  16.           Elb := GetInput;
  17.           Case Elb Of
  18.             71 : Elc := ^W;
  19.             75 : Elc := ^S;
  20.             77 : Elc := ^D;
  21.             79 : Elc := ^R;
  22.             82 : Elc := ^V;
  23.             83 : Elc := ^G;
  24.           Else
  25.             Elc := #0;
  26.           End;
  27.         End
  28.         Else
  29.         Begin
  30.           Elc := Char(Elb);
  31.         End;
  32.       Until Elc In [^A,^C,^D,^F,^G,^H,^L,^M,^Q,^R,^S,^U,^V,^W,' '..'~'];
  33.       Case Elc Of
  34.         ^A : Begin (* Move left to previous word *)
  35.                If CharacterPosition > 2 Then
  36.                Begin
  37.                  Dec(CharacterPosition);
  38.                  While (LineToEdit[CharacterPosition] = ' ') And (CharacterPosition > 1) Do Dec(CharacterPosition);
  39.                End;
  40.                While (LineToEdit[CharacterPosition] <> ' ') And (CharacterPosition > 1) Do Dec(CharacterPosition);
  41.                If LineToEdit[CharacterPosition] = ' ' Then Inc(CharacterPosition);
  42.                While (CharacterPosition-OffSet) < 1 Do Dec(OffSet);
  43.                AnsiGotoXY(Row,1+Col);
  44.                AnsiClearToEOL;
  45.                Write(Copy(LineToEdit,OffSet+1,79));
  46.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  47.              End;
  48.         ^C : Begin (* UpperCase first character *)
  49.                LineToEdit := CapFirst(LineToEdit);
  50.                AnsiGotoXY(Row,1+Col);
  51.                AnsiClearToEOL;
  52.                Write(Copy(LineToEdit,OffSet+1,79));
  53.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  54.              End;
  55.         ^D : Begin (* Move right one character *)
  56.                If CharacterPosition <= Length(LineToEdit) Then
  57.                Begin
  58.                  Inc(CharacterPosition);
  59.                  If (CharacterPosition-(OffSet+1)) > 79 Then
  60.                  Begin
  61.                    Inc(OffSet);
  62.                    AnsiGotoXY(Row,1+Col);
  63.                    Write(Copy(LineToEdit,OffSet+1,79));
  64.                  End;
  65.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  66.                End;
  67.              End;
  68.         ^F : Begin (* Move right to next word *)
  69.                While (LineToEdit[CharacterPosition] <> ' ') And (CharacterPosition <= Length(LineToEdit)) Do
  70.                Begin
  71.                  Inc(CharacterPosition);
  72.                End;
  73.                While (LineToEdit[CharacterPosition] = ' ') And (CharacterPosition <= Length(LineToEdit)) Do
  74.                Begin
  75.                  Inc(CharacterPosition);
  76.                End;
  77.                AnsiGotoXY(Row,CharacterPosition+Col);
  78.                While (CharacterPosition-OffSet) > 79 Do Inc(OffSet);
  79.                AnsiGotoXY(Row,1+Col);
  80.                AnsiClearToEOL;
  81.                Write(Copy(LineToEdit,OffSet+1,79));
  82.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  83.              End;
  84.         ^G : Begin (* Delete character under cursor *)
  85.                If CharacterPosition <= Length(LineToEdit) Then
  86.                Begin
  87.                  Delete(LineToEdit,CharacterPosition,1);
  88.                  AnsiGotoXY(Row,1+Col);
  89.                  AnsiClearToEOL;
  90.                  Write(Copy(LineToEdit,OffSet+1,79));
  91.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  92.                End;
  93.              End;
  94.         ^H : Begin (* Delete character to left of cursor *)
  95.                If CharacterPosition > 1 Then
  96.                Begin
  97.                  Dec(CharacterPosition);
  98.                  Delete(LineToEdit,CharacterPosition,1);
  99.                  AnsiGotoXY(Row,1+Col);
  100.                  AnsiClearToEOL;
  101.                  Write(Copy(LineToEdit,OffSet+1,79));
  102.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  103.                End;
  104.              End;
  105.         ^L : Begin (* LowerCase entire line *)
  106.                LineToEdit := LowerString(LineToEdit);
  107.                AnsiGotoXY(Row,1+Col);
  108.                AnsiClearToEOL;
  109.                Write(Copy(LineToEdit,OffSet+1,79));
  110.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  111.              End;
  112.         ^R : Begin (* Move to end of line *)
  113.                CharacterPosition := Length(LineToEdit)+1;
  114.                While Copy(LineToEdit,CharacterPosition,1) = ' ' Do Delete(LineToEdit,CharacterPosition,1);
  115.                If CharacterPosition > 79 Then
  116.                Begin
  117.                  OffSet := CharacterPosition-79;
  118.                End
  119.                Else
  120.                Begin
  121.                  OffSet := 0;
  122.                End;
  123.                If OffSet > 0 Then
  124.                Begin
  125.                  AnsiGotoXY(Row,1);
  126.                  Write(Copy(LineToEdit,OffSet+1,79)+' ');
  127.                End;
  128.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  129.              End;
  130.         ^S : Begin (* Move left one character *)
  131.                If CharacterPosition > 1 Then
  132.                Begin
  133.                  Dec(CharacterPosition);
  134.                  If (CharacterPosition-OffSet) < 1 Then
  135.                  Begin
  136.                    Dec(OffSet);
  137.                    AnsiGotoXY(Row,1);
  138.                    Write(Copy(LineToEdit,OffSet+1,79));
  139.                  End;
  140.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  141.                End;
  142.              End;
  143.         ^U : Begin (* UpperCase entire line *)
  144.                LineToEdit := UpperString(LineToEdit);
  145.                AnsiGotoXY(Row,1+Col);
  146.                AnsiClearToEOL;
  147.                Write(Copy(LineToEdit,OffSet,79));
  148.                AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  149.              End;
  150.         ^V : Begin (* Toggle insert and overwrite *)
  151.                If OverWrite Then
  152.                Begin
  153.                  OverWrite := False;
  154.                  AnsiGotoXY(24,1);
  155.                  NewTextColor(Black);
  156.                  NewTextBackground(Cyan);
  157.                  Write('Insert   ');
  158.                  AnsiGotoXY(Row,1+Col);
  159.                  NewTextColor(White);
  160.                  NewTextBackground(Black);
  161.                  If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  162.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  163.                End
  164.                Else
  165.                Begin
  166.                  OverWrite := True;
  167.                  AnsiGotoXY(24,1);
  168.                  NewTextColor(Black);
  169.                  NewTextBackground(Cyan);
  170.                  Write('OverWrite');
  171.                  AnsiGotoXY(Row,1+Col);
  172.                  NewTextColor(White);
  173.                  NewTextBackground(Black);
  174.                  If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  175.                  AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  176.                End;
  177.              End;
  178.         ^W : Begin (* Move to begining of line *)
  179.                CharacterPosition := 1;
  180.                If OffSet > 0 Then
  181.                Begin
  182.                  OffSet := 0;
  183.                  AnsiGotoXY(Row,1);
  184.                  Write(Copy(LineToEdit,1,79));
  185.                End;
  186.                AnsiGotoXY(Row,CharacterPosition+Col);
  187.              End;
  188.       Else
  189.         If Elc <> ^M Then
  190.         Begin
  191.           If Elc = ^Q Then
  192.           Begin
  193.             AnsiGotoXY(24,1);
  194.             NewTextColor(Black);
  195.             NewTextBackground(Cyan);
  196.             Write('Quoting  ');
  197.             AnsiGotoXY(Row,1+Col);
  198.             NewTextColor(White);
  199.             NewTextBackground(Black);
  200.             If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  201.             Elb := GetInput;
  202.             Elc := Char(Elb);
  203.             AnsiGotoXY(24,1);
  204.             NewTextColor(Black);
  205.             NewTextBackground(Cyan);
  206.             If OverWrite Then Write('OverWrite') Else Write('Insert   ');
  207.             AnsiGotoXY(Row,1+Col);
  208.             NewTextColor(White);
  209.             NewTextBackground(Black);
  210.             If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  211.           End;
  212.           If OverWrite Then
  213.           Begin
  214.             If CharacterPosition <= Length(LineToEdit) Then
  215.             Begin
  216.               LineToEdit[CharacterPosition] := Elc;
  217.               AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  218.               If (CharacterPosition-(OffSet+1)) < 79 Then Write(Elc);
  219.               Inc(CharacterPosition);
  220.               If (CharacterPosition-(OffSet+1)) > 79 Then
  221.               Begin
  222.                 Inc(OffSet);
  223.                 AnsiGotoXY(Row,1);
  224.                 Write(Copy(LineToEdit,OffSet+1,79));
  225.               End;
  226.               AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  227.             End
  228.             Else
  229.             Begin
  230.               If Length(LineToEdit) < MaxLength Then
  231.               Begin
  232.                 LineToEdit := LineToEdit + Elc;
  233.                 AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  234.                 If (CharacterPosition-(OffSet+1)) < 79 Then Write(Elc);
  235.                 Inc(CharacterPosition);
  236.                 If (CharacterPosition-(OffSet+1)) > 79 Then
  237.                 Begin
  238.                   Inc(OffSet);
  239.                   AnsiGotoXY(Row,1);
  240.                   Write(Copy(LineToEdit,OffSet+1,79));
  241.                 End;
  242.                 AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  243.               End;
  244.             End;
  245.           End
  246.           Else
  247.           Begin
  248.             If Length(LineToEdit) < MaxLength Then
  249.             Begin
  250.               LineToEdit := Copy(LineToEdit,1,CharacterPosition-1)+Elc+Copy(LineToEdit,CharacterPosition,Length(LineToEdit));
  251.               AnsiGotoXY(Row,1+Col); Write(Copy(LineToEdit,OffSet+1,79)); Inc(CharacterPosition);
  252.               AnsiGotoXY(Row,(CharacterPosition+Col)-OffSet);
  253.             End;
  254.           End;
  255.         End;
  256.       End;
  257.     Until Elc = ^M;
  258.     EditLine := LineToEdit;
  259.   End;
  260. {========================================================================}
  261. Procedure EditDescriptionLine;
  262.   Var
  263.     MaxLength : Byte;
  264.   Begin
  265.     If CurrentEntry^.TypeOfRecord = Comment Then MaxLength := 79 Else MaxLength := 141;
  266.     CurrentEntry^.Description := EditLine(CurrentEntry^.Description,MaxLength,25,0);
  267.   End;
  268. {========================================================================}
  269. Procedure EditDescription;
  270.   Var
  271.     edc : char;
  272.   Begin
  273.     If CurrentEntry^.TypeOfRecord <> Orphan Then
  274.     Begin
  275.       Altered := True;
  276.       AnsiGotoXY(24,1); NewTextColor(Black); NewTextBackground(Cyan);
  277.       Write('OverWrite  ^w/^a/^s Left  ^d/^f/^r Right  ^h/^g Del ^v Toggle Insert            ');
  278.       AnsiGotoXY(25,1); NewTextBackground(Black);
  279.       If CurrentEntry^.TypeOfRecord = Comment Then NewTextColor(White) Else NewTextColor(Cyan);
  280.       AnsiClearToEOL; Write(Copy(CurrentEntry^.Description,1,79));
  281.       EditDescriptionLine;
  282.       AnsiGotoXY(25,1); AnsiClearToEOL;
  283.       If CurrentEntry^.TypeOfRecord = Comment Then
  284.       Begin
  285.         NewTextColor(White);
  286.         AnsiGotoXY(Row,2); AnsiClearToEOL;
  287.         Write(CurrentEntry^.Description);
  288.       End
  289.       Else
  290.       Begin
  291.         NewTextColor(Cyan);
  292.         AnsiGotoXY(Row,33); AnsiClearToEOL;
  293.         Write(Copy(CurrentEntry^.Description,1,48));
  294.       End;
  295.       AnsiGotoXY(24,1);
  296.       NewTextColor(Black);
  297.       NewTextBackground(Cyan);
  298.       Write(Pgmid+'      ^Q=quit ?=help');
  299.       NewTextColor(White);
  300.       NewTextBackground(Black);
  301.       AnsiGotoXY(24,80);
  302.     End;
  303.   End;
  304. {========================================================================}
  305.